package com.zw.a.basic.a09.demo07_inner;

//案例: 演示匿名内部类的使用场景和小技巧.
/*
    使用场景:
        1. 当对对象方法(也叫: 成员方法)仅调用一次的时候.
        2. 匿名内部类可以作为方法的实参进行传递.
    小技巧:
        当抽象类或者接口中的抽象方法不超过3个的时候(一般是只有1个), 就可以考虑使用匿名内部类.
 */
public class AnimalTest02 {
    public static void main(String[] args) {
        //1. 演示 当对对象方法(也叫: 成员方法)仅调用一次的时候.
        //需求: 调用Animal#eat();
        new Animal(){
            @Override
            public void eat() {
                System.out.println("匿名内部类创建Animal对象, 重写eat()方法");
            }
        }.eat();

        System.out.println("--------------------------");

        //多态
        Animal an = new Animal(){   //相当于: Animal an = new Cat();
            @Override
            public void eat() {
                System.out.println("匿名内部类创建Animal对象, 重写eat()方法");
            }
        };
        an.eat();
        an.eat();
        an.eat();
        System.out.println("--------------------------");

        //2. 演示 匿名内部类可以作为方法的实参进行传递.
        //show(Animal类型的子类对象.);
        //show(new Cat());      //这样写OK
        //show(an);             //这样写也可以, 通过匿名内部类实现.

        show(new Animal(){      //实际开发经常这样写.
            @Override
            public void eat() {
                System.out.println("匿名内部类创建Animal对象, 重写eat()方法");
            }
        });
    }

    //定义方法, 接收Animal类型的对象.
    public static void show(Animal an) {
        an.eat();
    }
}
